from sys import version

import sqlalchemy
from sqlalchemy.orm import Session
from sqlalchemy.sql.selectable import _OffsetLimitParam
from sqlalchemy.sql.util import _offset_or_limit_clause
from . import models, schemas
from typing import Optional, List


# todo @付康
# 模板可参考crud.py

def version2int(version):
    vi = 0
    for i, v in enumerate(version.split('.')):
        vi += int(v) * 10 ** (6 - 2 * i)
    return vi


async def get_version_by_condition(db: Session,
                                   platform: Optional[str] = None,  # 选择平台(android/ios)升级
                                   update_version_code: Optional[str] = None,  # 选择制定版本进行升级（有的话将最大版本号最小版本号同时设置为此值）
                                   max_update_version_code: Optional[str] = None,  # 选择可升级的最大版本号进行升级（默认所有中的最大值）
                                   min_update_version_code: Optional[str] = None,  # 选择可升级的最小版本号进行升级（默认所有中的最小值）
                                   max_os_api: Optional[int] = None,  # 选择支持的最大操作系统版本进行升级（默认所有中的最大值）
                                   min_os_api: Optional[int] = None,  # 选择支持的最小操作系统版本进行升级（默认所有中的最大值）
                                   cpu_arch: Optional[str] = None,  # 选择CPU架构进行升级
                                   channel: Optional[str] = None,  # 选择不同应用商店进行升级
                                   page: Optional[int] = 1,  # 选择第几页
                                   page_number: Optional[int] = 10,  # 选择每页的版本信息数量
                                   ) -> List[models.Version]:
    result = db.query(models.Version)
    if update_version_code:
        result = result.filter(models.Version.version == version2int(update_version_code))
    if max_update_version_code:
        result = result.filter(models.Version.version <= version2int(max_update_version_code))
    if min_update_version_code:
        result = result.filter(models.Version.version >= version2int(min_update_version_code))
    if max_os_api:
        result = result.filter(models.Version.max_os_api <= int(max_os_api))
    if min_os_api:
        result = result.filter(models.Version.min_os_api >= int(min_os_api))
    if platform:
        result = result.filter(models.Version.platform == platform)
    if cpu_arch:
        result = result.filter(models.Version.cpu_arch == cpu_arch)
    if channel:
        result = result.filter(models.Version.channel == channel)
    return result.order_by(models.Version.version.desc()).offset(page).limit(page_number).all()


async def get_version_count(db: Session,
                            platform: Optional[str] = None,  # 选择平台(android/ios)升级
                            update_version_code: Optional[str] = None,  # 选择制定版本进行升级（有的话将最大版本号最小版本号同时设置为此值）
                            max_update_version_code: Optional[str] = None,  # 选择可升级的最大版本号进行升级（默认所有中的最大值）
                            min_update_version_code: Optional[str] = None,  # 选择可升级的最小版本号进行升级（默认所有中的最小值）
                            max_os_api: Optional[int] = None,  # 选择支持的最大操作系统版本进行升级（默认所有中的最大值）
                            min_os_api: Optional[int] = None,  # 选择支持的最小操作系统版本进行升级（默认所有中的最大值）
                            cpu_arch: Optional[str] = None,  # 选择CPU架构进行升级
                            channel: Optional[str] = None,  # 选择不同应用商店进行升级
                            page: Optional[int] = 1,  # 选择第几页
                            page_number: Optional[int] = 10,  # 选择每页的版本信息数量
                            ) -> int:
    result = db.query(sqlalchemy.func.count(models.Version.bid))
    if update_version_code:
        result = result.filter(models.Version.version == version2int(update_version_code))
    if max_update_version_code:
        result = result.filter(models.Version.version <= version2int(max_update_version_code))
    if min_update_version_code:
        result = result.filter(models.Version.version >= version2int(min_update_version_code))
    if max_os_api:
        result = result.filter(models.Version.max_os_api <= int(max_os_api))
    if min_os_api:
        result = result.filter(models.Version.min_os_api >= int(min_os_api))
    if platform:
        result = result.filter(models.Version.platform == platform)
    if cpu_arch:
        result = result.filter(models.Version.cpu_arch == cpu_arch)
    if channel:
        result = result.filter(models.Version.channel == channel)
    return result.scalar()


async def get_versions_by_page(db: Session,
                               page: Optional[int] = 1,
                               page_number: Optional[int] = 20):
    version = db.query(models.Version).offset(page).limit(page_number)
    return version.all()
